package com.xingxuecn.limit.service.impl;

import com.xingxuecn.limit.common.model.dto.Menu;
import com.xingxuecn.limit.common.model.dto.RoleMenu;
import com.xingxuecn.limit.common.model.vo.TreeNode;
import com.xingxuecn.limit.dao.MenuDao;
import com.xingxuecn.limit.dao.RoleMenuDao;
import com.xingxuecn.limit.dao.impl.MenuDaoImpl;
import com.xingxuecn.limit.dao.impl.RoleMenuDaoImpl;
import com.xingxuecn.limit.service.LimitService;

import java.sql.SQLException;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * @author Kris at 2018/9/12 14:33
 */
public class LimitServiceImpl implements LimitService {
    RoleMenuDao roleMenuDao = new RoleMenuDaoImpl();
    MenuDao menuDao = new MenuDaoImpl();

    @Override
    public boolean roleMenu(Integer roleId, Set<Integer> menuIds, Boolean checked){
        if (roleId == null || menuIds == null || checked == null) {
            return false;
        }
        try{
            int rows = 0;
            //无论是赋权还是取消赋权，都先把权限取消掉。如果是勾选，再把权限增加上，这样做可以避免关联关系表出现重复数据。
            for(Integer menuId:menuIds){
                RoleMenu roleMenu = new RoleMenu(roleId, menuId);
                rows += roleMenuDao.delete(roleMenu);
                if(checked){
                    rows += roleMenuDao.add(roleMenu);
                }
            }
            return rows > 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }


    }

    @Override
    public List<TreeNode> loadMenuByRole(Integer roleId) throws SQLException {
        //查到所有的菜单
        List<Menu> menuAll = menuDao.findAll();
        //查到有权限的菜单
        List<Menu> menuLimits = roleMenuDao.loadMenuByRole(roleId);
        //取出所有有权限的菜单ID。
        Set<Integer> limitIdSet = new HashSet<>();
        for(Menu menu:menuLimits){
            limitIdSet.add(menu.getId());
        }
        //将菜单转换为List<TreeNode>,并且设置是否选中
        List<TreeNode> treeNodes = new LinkedList<>();
        for(Menu menu:menuAll){
            Boolean isLimit = false;
            if(limitIdSet.contains(menu.getId())){
                isLimit = true;
            }
            TreeNode treeNode = new TreeNode(menu.getId(), menu.getParent_id(), menu.getName(), menu.getUrl(),isLimit, null);
            treeNodes.add(treeNode);
        }
        return TreeNode.buildTree(treeNodes);
    }
}
